home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / 215_01.zip / BBSC.C next >
Text File  |  1980-01-01  |  27KB  |  1,396 lines

  1. /*
  2.     bbsc.c
  3.  
  4.     BBS (Bulletin Board System) written in BDS "C".
  5.  
  6.         Support files needed:
  7.             bdscio.h
  8.             bbscdef.h
  9.             bbscport.crl or bbscport.c
  10.             bbsclock.crl or bbsclock.c
  11.             bbscfile.crl or bbscfile.c
  12.             bbscmisc.crl or bbscmisc.c
  13.  
  14.         To compile/link do:
  15.  
  16.             >cc1 bbsc.c
  17.             >cc1 bbscport  <----- optional if .crl file not present
  18.             >cc1 bbsclock  <----- optional if .crl file not present
  19.             >cc1 bbscfile  <----- optional if .crl file not present
  20.             >cc1 bbscmisc  <----- optional if .crl file not present
  21.             >clink bbsc -s -f bbscport -f bbsclock -f bbscfile -f bbscmisc -e 800
  22.  
  23.                 Mike Kelly
  24.  
  25.     03/09/83 v1.0    written
  26.     07/07/83 v1.0    updated
  27. */
  28. #include "bdscio.h"
  29. #include "bbscdef.h"
  30.  
  31.  
  32. #define LASTDATE  " 07/07/83 "
  33.  
  34. #define PGMNAME "BBSc    "
  35. #define VERSION " 1.0 "
  36.  
  37.  
  38. main(argc,argv)
  39.  
  40. char    **argv;
  41.  
  42. int    argc;
  43.  
  44. {
  45.     int    i;
  46.  
  47. /*
  48. *        init global variables
  49. */
  50.     debug     = FALSE;
  51.     offline = FALSE;
  52.     statcnt = 0;
  53.     xpert    = FALSE;
  54.     active    = TRUE;
  55.  
  56.     w_fname[0] = "\0";
  57.     w_lname[0] = "\0";
  58.     strcpy(w_password,"MPK0");
  59.  
  60.     u_fname[0] = "\0";
  61.     u_lname[0] = "\0";
  62.     strcpy(u_password,"MPK0");
  63.     u_time1[0] = "\0";
  64.     u_date1[0] = "\0";
  65.     u_time2[0] = "\0";
  66.     u_date2[0] = "\0";
  67.     u_city[0]  = "\0";
  68.  
  69.     mm[0]    = "\0";
  70.     dd[0]    = "\0";
  71.     yy[0]    = "\0";
  72.     month[0] = "\0";
  73.     day[0]   = "\0";
  74.     year[0]  = "\0";
  75.     date[0]  = "\0";
  76.     week[0]  = "\0";
  77.     time[0]  = "\0";
  78.  
  79.     strcpy(msg_delete,"0\0");
  80.     msg_no[0]   = "\0";
  81.     msg_date[0] = "\0";
  82.     msg_date[0] = "\0";
  83.     msg_time[0] = "\0";
  84.     msg_to[0]   = "\0";
  85.     msg_from[0] = "\0";
  86.     msg_pass[0] = "\0";
  87.     msg_subject[0] = "\0";
  88.     msg_text[0] = "\0";
  89.  
  90.     stop_that = FALSE;
  91.  
  92. /*
  93. *        end global init
  94. */
  95.  
  96. /*
  97. *        check for DEBUG/OFFLINE mode on command line
  98. */
  99.     if (argc > 1)
  100.     {
  101.         printf("\nargc=%04u  argc hex=%04x\n",argc,argc);
  102.         for (i = 1; i < argc; i++)
  103.         {
  104.                 printf("argv[%02u]=%s \n",i,*++argv);
  105.  
  106.             if (strcmp(*argv,"DEBUG") == OK)
  107.             {
  108.                     printf("\nDebug mode on!\n\n");
  109.                     debug = TRUE;
  110.             }
  111.  
  112.             if (strcmp(*argv,"OFFLINE") == OK)
  113.             {
  114.                     printf("\nOffline mode on!\n\n");
  115.                     offline = TRUE;
  116.             }
  117.         }
  118.     }
  119.  
  120.  
  121. /*
  122. *            get date and time from the clock
  123. */
  124.     gettime(time);
  125.     getdate(mm,dd,yy,month,day,year,date,week);
  126.  
  127. /*    unlink(MSGX1);            /* delete temporary file */
  128.     unlink(MSGX2);            /* delete temporary file */
  129. */
  130.  
  131.     portinit(USER7);    /* init modem port */
  132.     signon();
  133.     driver(argc,argv);
  134.     signoff();
  135. }
  136. /*    end of mainline routine     */
  137.  
  138.  
  139. driver(argc,argv)
  140.  
  141. char    **argv;
  142. int    argc;
  143.  
  144. {
  145. char    linebuf[MAXLINE],
  146.     buf[128],
  147.     *bufptr,        /* ptr to buf */
  148.     usercd[100],        /* user record */
  149.     *userptr,        /* ptr to usercd */
  150.     cmd[2];
  151.  
  152. int    cnt,
  153.     ok_sw,
  154.     case_sw,
  155.     i,
  156.     num0,
  157.     num1,
  158.     num2;
  159.  
  160.     cnt    = 0;
  161.     ok_sw    = TRUE;
  162.     bufptr    = &buf;
  163.     xpert    = FALSE;
  164.     cmd[0]  = '\0';
  165.  
  166.     while (active)
  167.     {
  168.         stop_that = 0;        /* reset switch */
  169.         if (xpert)
  170.         {
  171.             portsout(CRLF);
  172.             portsout("===>");
  173.         }
  174.         else
  175.         {
  176.             portsout(CRLF);
  177.             portsout("Commands: B,C,E,G,K,Q,R,S,X or ? ===>");
  178.         }
  179.  
  180. /*        while (portinstat());
  181.         byte = portin();
  182.         while (portoutstat());
  183.         portout(byte);
  184. */
  185.         portsin(cmd,1);
  186.         portsout(CRLF);
  187.  
  188.         switch (cmd[0])
  189.         {
  190.             case ('B'):        /* goodby */
  191.                 cmd_b();
  192.                 break;
  193.             case ('C'):        /* cp/m */
  194.                 cmd_c();
  195.                 break;
  196.             case ('E'):        /* enter msg */
  197.                 cmd_e();
  198.                 break;
  199.             case ('G'):        /* goodby */
  200.                 cmd_g();
  201.                 break;
  202.             case ('K'):        /* kill msg */
  203.                 cmd_k();
  204.                 break;
  205.             case ('Q'):        /* quick scan */
  206.                 cmd_q();
  207.                 break;
  208.             case ('R'):        /* read msg */
  209.                 cmd_r();
  210.                 break;
  211.             case ('S'):        /* scan msg */
  212.                 cmd_s();
  213.                 break;
  214.             case ('X'):        /* xpert toggle */
  215.                 cmd_x();
  216.                 break;
  217.             case ('?'):        /* help */
  218.                 cmd_h();
  219.                 break;
  220.             default:
  221.                 break;
  222.         }
  223.  
  224.     }
  225. }
  226. /*    end of function        */
  227.  
  228. cmd_b()            /* good-by */
  229. {
  230.     active = FALSE;
  231.     portsout("\r\nThanks for calling ");
  232.     portsout(w_fname);
  233.     portsout(CRLF);
  234.     sleep(25);            /* for the Smartmodem */
  235.     portsout("+");            /* get the modems attention */
  236.     sleep(1);            /* for the Smartmodem */
  237.     portsout("+");            /* get the modems attention */
  238.     sleep(1);            /* for the Smartmodem */
  239.     portsout("+");            /* get the modems attention */
  240.     sleep(25);            /* for the Smartmodem */
  241.     gobble();
  242.     portsout("ATH\r\n");        /* hang up the phone */
  243. }
  244. /*    end of function        */
  245.  
  246. cmd_c()            /* go to cp/m */
  247. {
  248.     portsout("Going to CP/M...\r\n");
  249.     active = FALSE;
  250. }
  251. /*    end of function        */
  252.  
  253. cmd_e()            /* enter a message */
  254. {
  255.     int    entering,
  256.         editing,
  257.         cnt1;
  258.     char    msg[50],
  259.         l_cnt[3],
  260.         ans[2];
  261.  
  262.     entering = editing = TRUE;
  263.     cnt1 = 0;
  264.     l_cnt[0] = '0';            /* init line count */
  265.     msg_text[0] = '\0';        /* init message text area */
  266.  
  267. #ifdef DEBUG
  268.     if (debug)
  269.     {
  270.         printf("text s.b. empty!  text = ");
  271.         prthex(msg_text);
  272.         printf("\n");
  273.     }
  274. #endif
  275.     portsout(CRLF);
  276.     portsout("This will be message # ");
  277.     portsout(h_next_msg);
  278.     portsout(CRLF);
  279.     portsout("                ____.____1____.____2\r\n");
  280.     portsout("Who is the message for  ===>");
  281.     portsin(msg_to,20);
  282.     portsout(CRLF);
  283.     portsout("What is the subject     ===>");
  284.     portsin(msg_subject,20);
  285.     portsout(CRLF);
  286.  
  287. #ifdef DEBUG
  288.     if  (debug)
  289.     {
  290.         printf("msg_to=%s\n",msg_to);
  291.         printf("msg_subject=\n",msg_subject);
  292.         prthex(msg_subject);
  293.     }
  294. #endif
  295.     portsout(CRLF);
  296.     portsout(CRLF);
  297.     portsout("A line can contain 40 characters, with a maximum of 20 lines.\r\n");
  298.     portsout("To end, enter a carriage return on an empty line.");
  299.     portsout(CRLF);
  300.     portsout(CRLF);
  301.     portsout("   .___.____1____.____2____.____3____.____4");
  302.     portsout(CRLF);
  303.  
  304.     while (entering)        /* get the text of the message */
  305.     {
  306.         linecnt(l_cnt);        /* calc line count */
  307.  
  308.         portsout(l_cnt);    /* show line count */
  309.         portsout(">");        /*  and prompt */
  310.  
  311.         portsin(msg,40);
  312.         portsout(CRLF);
  313.  
  314.         strcat(msg,"\r");    /* put a <cr> on each line */
  315.  
  316. #ifdef DEBUG
  317.         if (debug)
  318.         {
  319.             printf("msg=%s\n",msg);
  320.             printf("loop cnt = %d\n",cnt1);
  321.         }
  322. #endif
  323.         strcat(msg_text,msg);        /* append each line to text */
  324.         if (strlen(msg) < 2  ||        /* count cr too */
  325.                (++cnt1) > 19)        /* only allow 20 lines */
  326.         {
  327.             entering = FALSE;    /* all done */
  328.         }
  329.     }
  330.  
  331.     while (editing)        /* save it, fix it, list it, or get out */
  332.     {
  333.         portsout(CRLF);
  334.         portsout("\r\n(S)ave, (E)dit, (L)ist, (Q)uit   ==>");
  335.  
  336.         portsin(ans,1);            /* get a byte */ 
  337.         portsout(CRLF);
  338.  
  339.         switch (ans[0])            /* get 1 byte */
  340.         {
  341.             case ('S'):        /* save message */
  342.                 savemsg();
  343.                 editing = FALSE; /* get out of while */
  344.                 break;
  345.             case ('E'):        /* edit message */
  346.                 editmsg();
  347.                 break;
  348.             case ('L'):        /* list message */
  349.                 listmsg();
  350.                 break;
  351.             case ('Q'):        /* get out w/out saving */
  352.                 editing = FALSE; /* get out of while */
  353.                 break;
  354.             default:
  355.                 portsout("\n\r");
  356.                 portsout("Shall we try that one more time?\r\n");
  357.                 break;
  358.         }    
  359.     }
  360.  
  361. }
  362. /*    end of function        */
  363.  
  364. linecnt(lcnt)            /* 2 byte string of line numbers */
  365. char    *lcnt;
  366. {
  367.     int    icnt;
  368.     char    xcnt[4];
  369.  
  370.     icnt = atoi(lcnt);
  371.     if (++icnt < 10)
  372.     {
  373.         strcpy(lcnt,"0");
  374.         itoa(xcnt,icnt);
  375.         strcat(lcnt,xcnt);
  376.     }
  377.     else
  378.     {
  379.         itoa(xcnt,icnt);
  380.         strcpy(lcnt,xcnt);
  381.     }
  382.     return;
  383. }
  384. /*    end of function        */
  385.  
  386. savemsg()                /* save a message */
  387. {
  388.     int    fd;
  389.  
  390.     portsout("Saving...\r\n");
  391.  
  392.     strcpy(msg_delete,"0\0");    /* delete byte */
  393.     strcpy(msg_date,"\0");        /* move the date in */
  394.     strcat(msg_date,mm);
  395.     strcat(msg_date,"/");
  396.     strcat(msg_date,dd);
  397.     strcat(msg_date,"/");
  398.     strcat(msg_date,yy);
  399.     strcat(msg_date,"\0");
  400.  
  401.     strcpy(msg_time,time);        /* and the time */
  402.  
  403.     strcpy(msg_from,w_fname);    /* and the from name */
  404.     strcat(msg_from," ");
  405.     strcat(msg_from,w_lname);
  406.  
  407. #ifdef DEBUG
  408.     if (debug)
  409.     {
  410.         printf("msg_time=");
  411.         prthex(msg_time);
  412.         printf("\n");
  413.         printf("msg_date=%s\n",msg_date);
  414.         printf("msg_from=%s\n",msg_from);
  415.     }
  416. #endif
  417.     portsout("Updating the message file...\r\n");
  418.     if ((fd = msgopen(2)) == ERROR)        /* open i/o */
  419.     {
  420.         return(ERROR);
  421.     }
  422.     msgwrt(fd);        /* write the message */
  423.     msgclose(fd);
  424.  
  425.     strcpy(h_date,msg_date);
  426.     portsout("Updating the header  file...\r\n");
  427.     hdrwrt();        /* update the header file */
  428. }
  429. /*    end of function        */
  430.  
  431.  
  432. listmsg()
  433. {
  434.     char    *ptr,
  435.         byte,
  436.         lcnt[3];
  437.     int    i;
  438.  
  439.     ptr = &msg_text;        /* ptr points to start of text */
  440.     lcnt[0] = '0';
  441.     
  442.     linecnt(lcnt);
  443.     portsout(lcnt);            /* put out line number */
  444.     portsout(">");
  445.  
  446.     while (byte = *ptr++)
  447.     {
  448.         while(portoutstat());
  449.         portout(byte);
  450.         if (byte == '\r')    /* we dont save <lf>, so add */
  451.         {            /*  it here when find a <cr> */
  452.             while(portoutstat());
  453.             portout('\n');
  454.             linecnt(lcnt);
  455.             portsout(lcnt);    /* put out line number */
  456.             portsout(">");
  457.         }
  458.     }
  459. #ifdef DEBUG
  460.     if (debug)
  461.     {
  462.         printf("ending listmsg\n");
  463.     }
  464. #endif
  465. }
  466. /*    end of function        */
  467.  
  468. editmsg()
  469. {
  470.     char    ans[3];
  471.     int    lnum;        /* line number to edit */
  472.  
  473.     while(1)
  474.     {
  475.         portsout(CRLF);
  476.         portsout("Enter line number to edit - RETURN to exit ==>");
  477.         portsin(ans,2);        /* only 20 lines possible */
  478.         portsout(CRLF);
  479.         lnum = atoi(ans);
  480.         if (lnum == 0)
  481.         {
  482.             break;        /* out of while and return */
  483.         }
  484.         if (lnum <= 20)
  485.         {
  486.             editline(lnum);
  487.         }
  488.         else            /* else slap on hand and loop around */
  489.         {
  490.             portsout("Aw come on, there can only be 20 lines!");
  491.             portsout(CRLF);
  492.             portsout("Shall we try that again?");
  493.             portsout(CRLF);
  494.         }
  495.     }        
  496. }
  497. /*    end of function        */
  498.  
  499. editline(line_no)
  500. int    line_no;
  501. {
  502.     char    work_msg[(20*40)+40],    /* work message area */
  503.         *work_ptr,        /* pointers */
  504.         *msg_ptr,
  505.         *new_ptr,
  506.         new_line[40+1],        /* new line to replace in text */
  507.         byte;
  508.     int    i;        /* a counter */
  509.  
  510.     work_msg[0] = '\0';    /* init strings */
  511.     new_line[0] = '\0';
  512.     i = 0;
  513.  
  514.     work_ptr = &work_msg;    /* put the addr of work_msg in the pointer */
  515.     msg_ptr  = &msg_text;    /* put the addr of the global message in ptr */
  516.     new_ptr  = &new_line;    /* the new line too */
  517.  
  518.     if (line_no != 1)
  519.     {
  520.         while(byte = *msg_ptr++)    /* move msg to work area */
  521.         {                /*  until end of msg */
  522.             *work_ptr++ = byte;
  523.             if (byte == '\r')        /* new line? */
  524.             {
  525.                 if (++i >= (line_no - 1)) /* at the line to edit? */
  526.                 {
  527.                     break;        /* then stop moving */
  528.                 }
  529.             }
  530.         }
  531.     }
  532. #ifdef DEBUG
  533.     if (debug)
  534.     {
  535.         printf("work_msg after move of 1st part = ");
  536.         prthex(work_msg);
  537.         printf("\n");
  538.     }
  539. #endif
  540.     if (i < (line_no - 1))    /* if true then there ain't no such beast */
  541.     {
  542.         portsout("Hmmm, can't seem to find that line");
  543.         portsout(CRLF);
  544.         portsout("   give me another chance, ok?");
  545.         portsout(CRLF);
  546.         return;        /* here we go round the mulberry bush */
  547.     }
  548.     portsout(CRLF);
  549.     portsout("Line to edit is:");
  550.     portsout(CRLF);
  551.     portsout(">");
  552.  
  553. #ifdef DEBUG
  554.     if (debug)
  555.     {
  556.         byte = *msg_ptr;
  557.         printf("1st byte of old line = ");
  558.         prthex(byte);
  559.     }
  560. #endif
  561.     while((byte = *msg_ptr++) != '\r')    /* show the line to edit */
  562.     {
  563.         while(portoutstat());
  564.         portout(byte);
  565.     }
  566.     portsout(CRLF);
  567.  
  568.     portsout("Enter corrected line:");
  569.     portsout(CRLF);
  570.     portsout(CRLF);
  571.     portsout(">");
  572.     portsin(new_line,40);
  573.     portsout(CRLF);
  574.     strcat(new_line,"\r\0");        /* put cr on end of new line */
  575.  
  576.     while (*work_ptr++ = *new_ptr++)    /* tag on new line to */
  577.     {                    /*  work area */
  578.         ;
  579.     }
  580.     *work_ptr--;                /* back up one */
  581.  
  582. #ifdef DEBUG
  583.     if (debug)
  584.     {
  585.         printf("after move of new line to msg, msg_text =");
  586.         prthex(msg_text);
  587.     }
  588. #endif
  589.     while (*work_ptr++ = *msg_ptr++)    /* now move in rest of */
  590.     {                    /*  message to work area */
  591.         ;
  592.     }
  593.     *work_ptr++ = '\0';        /* for luck */
  594.  
  595.     strcpy(msg_text,work_msg);    /* replace the message with the */
  596.                     /*  new line inserted */
  597. }
  598. /*    end of function        */
  599.  
  600. cmd_g()
  601. {
  602.     cmd_b();        /* same thing */
  603. }
  604. /*    end of function        */
  605.  
  606. cmd_k()
  607. {
  608.     char    ans[11];
  609.     int    kill_msg,
  610.         fd,
  611.         rc;
  612.  
  613.     portsout(CRLF);
  614.     portsout("Enter message number to delete ==>");
  615.     portsin(ans,10);
  616.     portsout(CRLF);
  617.     kill_msg = atoi(ans);
  618.     fd = msgopen(2);        /* open i/o */
  619.     if ((rc = msgread(fd,kill_msg)) == ERROR || rc == 0)
  620.     {
  621.         portsout("Can't delete that message");
  622.         portsout(CRLF);
  623.         return;
  624.     }
  625.     portsout("Deleting message...");
  626.     portsout(CRLF);
  627.     strcpy(msg_delete,"9");        /* mark for deletion */
  628.     if (msgrewrt(fd,kill_msg) == ERROR) /* re-write the record just read */
  629.     {
  630.         portsout("Sorry, can't delete that message");
  631.         portsout(CRLF);
  632.         return;
  633.     }
  634.     msgclose(fd);
  635.     portsout("Message ");
  636.     portsout(ans);
  637.     portsout(" has been deleted");
  638.     portsout(CRLF);
  639.     return;
  640. }
  641. /*    end of function        */
  642.  
  643. cmd_q()
  644. {
  645.     char    ans[11];
  646.     int    q_msg,
  647.         fd,
  648.         rc;
  649.  
  650.     if ((fd = msgopen(0)) == ERROR)        /* open input */
  651.     {
  652.         return(ERROR);
  653.     }
  654.     portsout(CRLF);
  655.     portsout("Enter starting message number -- RETURN to exit  ==>");
  656.     portsin(ans,10);
  657.     q_msg = atoi(ans);
  658.     if (q_msg == 0)            /* = 0 all done */
  659.     {
  660.         msgclose(fd);
  661.         return;
  662.     }
  663.     portsout(CRLF);
  664.     portsout(CRLF);
  665.     portsout("No.\t\tDate\t\tSubject");
  666.     portsout(CRLF);
  667.     portsout("---------------------------------------------------");
  668.     portsout(CRLF);
  669.  
  670.     while ((rc = msgread(fd,q_msg++)) != ERROR)
  671.     {                /* read until eof or error */
  672. #ifdef DEBUG
  673.         if (debug)
  674.         {
  675.             printf("in quick scan loop  rc from read = %d\n",rc);
  676.         }
  677. #endif
  678.         if (rc == 0)
  679.         {
  680.             continue;    /* not a valid msg */
  681.         }
  682.         portsout(msg_no);
  683.         portsout("\t\t");
  684.         portsout(msg_date);
  685.         portsout("\t");
  686.         portsout(msg_subject);
  687.         portsout(CRLF);
  688.         if (stop_that)        /* ctl-K ? */
  689.         {
  690.             stop_that = FALSE;
  691.             break;
  692.         }
  693.     }
  694.     portsout(CRLF);
  695.     msgclose(fd);
  696. }
  697. /*    end of function        */
  698.  
  699. cmd_r()
  700. {
  701.     char    msgno[10],
  702.         *text,
  703.         byte0;
  704.     int    msg,
  705.         fd,
  706.         rc;
  707.  
  708.     if ((fd = msgopen(0)) == ERROR)        /* open input */
  709.     {
  710.         return(ERROR);
  711.     }
  712.     portsout("\n\n\r");
  713.     portsout("Enter the message number to read ");
  714.     portsout(" - RETURN to exit   ==>");
  715.  
  716.     while (!stop_that)
  717.     {
  718.         portsin(msgno,9);
  719.         portsout(CRLF);
  720.         msg = atoi(msgno);    /* make the no. integer */
  721. #ifdef DEBUG
  722.         if (debug)
  723.         {
  724.             printf("in cmd_r, after atoi, msg=%d\r",msg);
  725.             printf("                      msgno=%s\n",msgno);
  726.         }
  727. #endif
  728.         if (msg == 0)
  729.         {
  730.             break;
  731.         }
  732.         if ((rc = msgread(fd,msg)) == 0 || rc == ERROR)
  733.         {
  734.             portsout("Message ");
  735.             portsout(msgno);
  736.             portsout(" not found\r\n");
  737.         }
  738.         else
  739.         {
  740. #ifdef DEBUG
  741.             if (debug)
  742.             {
  743.                 printf("msg no. returned from msgread=%d\n",
  744.                     rc);
  745.             }
  746. #endif
  747.             portsout(CRLF);
  748.             portsout("No. ");
  749.             portsout(msg_no);
  750.             portsout("  ");
  751.             portsout(msg_date);
  752.             portsout("  ");
  753.             portsout(msg_time);
  754.             portsout("\n\r");
  755.  
  756.             portsout("From: ");
  757.             portsout(msg_from);
  758.             portsout("   To: ");
  759.             portsout(msg_to);
  760.             portsout(CRLF);
  761.  
  762.             portsout("Subject: ");
  763.             portsout(msg_subject);
  764.             portsout(CRLF);
  765.             portsout(CRLF);
  766.  
  767.             text = &msg_text;
  768. #ifdef DEBUG
  769.             if (debug)
  770.             {
  771.                 printf("text pointer = ");
  772.                 prthex(text);
  773.                 printf("\n");
  774.             }
  775. #endif
  776.             while (byte0 = (*text++))
  777.             {
  778.                 while(portoutstat());
  779.                 portout(byte0);
  780.                 if (byte0 == '\r')
  781.                 {
  782.                     while(portoutstat());
  783.                     portout('\n');
  784.                 }
  785.                 if (stop_that)
  786.                 {
  787.                     stop_that = FALSE;
  788.                     msgclose(fd);
  789.                     return;
  790.                 }
  791.             }
  792.         }
  793.         portsout(CRLF);
  794.         portsout("# or RETURN to exit  ==>");
  795.     }
  796.     msgclose(fd);
  797. }
  798. /*    end of function        */
  799.  
  800. cmd_s()
  801. {
  802.     char    ans[11];
  803.     int    q_msg,
  804.         fd,
  805.         rc;
  806.  
  807.     if ((fd = msgopen(0)) == ERROR)        /* open input */
  808.     {
  809.         return(ERROR);
  810.     }
  811.     portsout(CRLF);
  812.     portsout("Enter starting message number -- RETURN to exit ) ==>");
  813.     portsin(ans,10);
  814.     q_msg = atoi(ans);
  815.     if (q_msg == 0)
  816.     {
  817.         return;
  818.     }
  819.     portsout(CRLF);
  820.     portsout(CRLF);
  821.     portsout("No.\tDate\t\tFrom\t\tTo");
  822.     portsout(CRLF);
  823.  
  824.     portsout("  Subject");
  825.     portsout(CRLF);
  826.  
  827.     portsout("------------------------------------------");
  828.     portsout(CRLF);
  829.  
  830.     while ((rc = msgread(fd,q_msg++)) != ERROR)
  831.     {                /* read until eof or error */
  832.         if (rc == 0)
  833.         {
  834.             continue;    /* not a valid msg */
  835.         }
  836.         portsout(msg_no);
  837.         portsout("\t");
  838.         portsout(msg_date);
  839.         portsout("\t");
  840.         portsout(msg_from);
  841.         portsout("\t");
  842.         portsout(msg_to);
  843.         portsout(CRLF);
  844.  
  845.         portsout("  ");
  846.         portsout(msg_subject);
  847.         portsout(CRLF);
  848.         portsout(CRLF);
  849.         if (stop_that)
  850.         {
  851.             stop_that = FALSE;
  852.             break;
  853.         }
  854.     }
  855.     portsout(CRLF);
  856.     msgclose(fd);
  857. }
  858. /*    end of function        */
  859.  
  860. cmd_x()
  861. {
  862.     xpert = !xpert;        /* flip the expert mode */
  863. }
  864. /*    end of function        */
  865.  
  866. cmd_h()        /* type help file */
  867. {
  868.  
  869.     if (fopen(HELP,ibuf) == ERROR)
  870.     {
  871.         portsout("\r\nSorry, Help not available\r\n");
  872.     }
  873.     else
  874.     {
  875.         porttype(ibuf);    /* type a file to port */
  876.         fclose(ibuf);    /* close it to free up fcb */
  877.     }
  878. }
  879. /*    end of function        */
  880.  
  881.  
  882. signon()    
  883. {
  884.     char    byte0;
  885.  
  886.     int    i;
  887.  
  888.     portsout(PGMNAME);
  889.     portsout("Version");
  890.     portsout(VERSION);
  891.     portsout(LASTDATE);
  892.     portsout("\r\r\n");
  893. /*
  894. *            type welcome file
  895. */
  896.     if (fopen(WELCOME,ibuf) == ERROR)
  897.     {
  898.         portsout("\r\nWelcome file not present, welcome anyhow\r\n");
  899.     }
  900.     else
  901.     {
  902.         porttype(ibuf);    /* type a file to port */
  903.         fclose(ibuf);
  904.     }
  905.  
  906.  
  907.     portsout("On at ");    /* give date and time of signon */
  908.     portsout(time);
  909.     portsout("  ");
  910.     portsout(week);
  911.     portsout("  ");
  912.     portsout(date);
  913.     portsout(CRLF);
  914. /*
  915. *            get name
  916. */
  917.     while (1)
  918.     {
  919.         portsout("\r\n\n");
  920.         portsout("Enter your first name   ==>");
  921.         portsin(w_fname,20);
  922.         portsout(CRLF);
  923.         portsout("Enter your last name    ==>");
  924.         portsin(w_lname,20);
  925.         portsout("\r\r\n");
  926.         portsout("Hello ");
  927.         portsout(w_fname);
  928.         portsout(" ");
  929.         portsout(w_lname);
  930.         portsout(CRLF);
  931.         portsout("Did I get your name right?  (Y/N) ==>");
  932.         while(portinstat());
  933.         byte0 = portin();    /* get answer */
  934.         portout(byte0);        /* send it back */
  935.         if (byte0 == 'Y')
  936.         {
  937.             portsout(CRLF);
  938.             if (checkuser())
  939.             {
  940. #ifdef DEBUG
  941.                 if (debug)
  942.                 {
  943.                     printf("found valid user\n");
  944.                 }
  945. #endif
  946.                 break;    /* got a valid user */
  947.             }
  948. #ifdef DEBUG
  949.             if (debug)
  950.             {
  951.                 printf("no valid user found\n");
  952.             }
  953. #endif
  954.         }
  955.     }
  956. /*
  957. *            type bulletins file
  958. */
  959.     if (fopen(BULLETINS,ibuf) == ERROR)
  960.     {
  961.         portsout("\r\nNo Bulletins today\r\n");
  962.     }
  963.     else
  964.     {
  965.         porttype(ibuf);    /* type a file to port */
  966.         fclose(ibuf);
  967.     }
  968.  
  969.     hdrread();        /* read msgs header file into memory */
  970. /*
  971. *            end of signon
  972. */
  973.  
  974. }
  975. /*    end of function        */
  976.         
  977. checkuser()            /* returns 1 when find a match */
  978. {
  979.     char    name[50];
  980.  
  981.     if (fopen(USERS,ibuf) == ERROR)
  982.     {
  983.         portsout("\r\nUser file not present, will log you on as");
  984.         portsout(" a GUEST\r\n");
  985.         strcpy(u_fname,"GUEST");
  986.         strcpy(u_lname," ");
  987.         strcpy(u_password,"MPK0");
  988.         return(TRUE);
  989.     }
  990.  
  991.     portsout("\nChecking user file...\r\n");
  992.  
  993.     while (readuser(ibuf) != 0)    /* look until eof on users file */
  994.     {
  995. #ifdef DEBUG
  996.         if (debug)
  997.         {
  998.             printf("    u_fname=%s\n",u_fname);
  999.             printf("    w_fname=%s\n",w_fname);
  1000.             printf("<cr>\n");
  1001.             getchar();
  1002.         }
  1003. #endif
  1004.         if ((strcmp(u_fname,w_fname) == OK) &&
  1005.             (strcmp(u_lname,w_lname) == OK))
  1006.         {
  1007. #ifdef DEBUG
  1008.             if (debug)
  1009.             {
  1010.                 printf("match on names\n");
  1011.                 printf("u_fname=%s\n",u_fname);
  1012.                 printf("u_lname=%s\n",u_lname);
  1013.                 printf("w_fname=%s\n",w_fname);
  1014.                 printf("w_lname=%s\n",w_lname);
  1015.                 printf("<cr>\n");
  1016.                 getchar();
  1017.             }
  1018. #endif
  1019.             if (checkpass() == OK)
  1020.             {
  1021.                 fclose(USERS,ibuf);
  1022.                 return(TRUE);    /* passwords match */
  1023.             }
  1024.             else
  1025.             {
  1026.                 fclose(USERS,ibuf);
  1027.                 return(FALSE);    /* passwords dont match */
  1028.             }
  1029.         }
  1030.     }
  1031.     fclose(USERS,ibuf);
  1032.     newuser();        /* not on file, so add 'em */
  1033. #ifdef DEBUG
  1034.     if (debug)
  1035.     {
  1036.         printf("end of while in checkuser\n");
  1037.     }
  1038. #endif
  1039.     return(TRUE);
  1040. }
  1041. /*    end of function        */
  1042.  
  1043. checkpass()            /* returns TRUE (1) when equal passwords */
  1044. {
  1045.     char    *passptr;
  1046.     int    j,
  1047.         i;
  1048.  
  1049.     passptr = w_password;    /* give passptr the addr of w_password */
  1050.  
  1051.     for (i = 0; i < 3; i++)        /* give 'em 3 tries to get it right */
  1052.     {
  1053.         portsout("\r\nEnter your password  ==>");
  1054.         for (j=0; j < 4; j++)    /* password is 4 long */
  1055.         {
  1056.             while(portinstat());
  1057. /*            *passptr++ = portin();
  1058. */
  1059.             w_password[j] = portin();
  1060.             portout('_');
  1061.         }
  1062. /*        *passptr++ = '\0';
  1063. */
  1064.         w_password[j] = '\0';
  1065.  
  1066.         portsout(CRLF);
  1067. #ifdef DEBUG
  1068.         if (debug)
  1069.         {
  1070.             printf("u_password=%s\n",u_password);
  1071.             printf("w_password=%s\n",w_password);
  1072.             printf("passptr=%s\n",passptr);
  1073.             printf("<cr>\n");
  1074.             getchar();
  1075.         }
  1076. #endif
  1077.         if ((strcmp(w_password,u_password)) == OK)
  1078.         {
  1079. #ifdef DEBUG
  1080.             if (debug)
  1081.             {
  1082.                 printf("passwords match\n");
  1083.             }
  1084. #endif
  1085.             return(OK);    /* passwords match */
  1086.         }
  1087.     }
  1088.     if (i >= 3)
  1089.     {
  1090.         portsout("\r\nSorry, but three tries is all you get\r\n");
  1091.         portsout("  Goodby....\r\n\r\n");
  1092.         return(ERROR);        /* bad try on password */
  1093.     }
  1094. }
  1095. /*    end of function        */
  1096.  
  1097. newuser()
  1098. {
  1099.     char    pword[5];
  1100.     int    j;
  1101.  
  1102. #ifdef DEBUG
  1103.     if (debug)
  1104.     {
  1105.         printf("in newuser\n");
  1106.     }
  1107. #endif
  1108.     portsout("Loading new user file...\r\n");
  1109.     filecpy(USERS,USERX);    /* copy file */
  1110.  
  1111.     strcpy(u_fname,w_fname);
  1112.     strcpy(u_lname,w_lname);
  1113.  
  1114.     strcpy(u_time1,time);
  1115.     strcpy(u_time2,time);
  1116.  
  1117.     strcpy(u_date1,"\0");
  1118.     strcat(u_date1,mm);
  1119.     strcat(u_date1,"/");
  1120.     strcat(u_date1,dd);
  1121.     strcat(u_date1,"/");
  1122.     strcat(u_date1,yy);
  1123.  
  1124.     strcpy(u_date2,"\0");
  1125.     strcat(u_date2,mm);
  1126.     strcat(u_date2,"/");
  1127.     strcat(u_date2,dd);
  1128.     strcat(u_date2,"/");
  1129.     strcat(u_date2,yy);
  1130.  
  1131.     portsout(CRLF);
  1132.     portsout("Welcome, as a new user I need a few pieces");
  1133.     portsout(" of information\r\n\r\n");
  1134.  
  1135.     portsout("Please enter the City, State you are from ===>");
  1136.     portsin(u_city,30);
  1137.     portsout(CRLF);
  1138.  
  1139.     while (1)
  1140.     {
  1141.         portsout(CRLF);
  1142.         portsout("Ok, now I need a 4 character password ");
  1143.         portsout("                ===>");
  1144.         for (j=0; j < 4; j++)    /* password is 4 long */
  1145.         {
  1146.             while(portinstat());
  1147.             u_password[j] = portin();
  1148.             portout('_');
  1149.         }
  1150.         u_password[j] = '\0';
  1151.         portsout("\r\n\n");
  1152.  
  1153.         portsout("Just to make sure we both remember it,");
  1154.         portsout(" enter it again ===>");
  1155.         for (j=0; j < 4; j++)    /* password is 4 long */
  1156.         {
  1157.             while(portinstat());
  1158.             w_password[j] = portin();
  1159.             portout('_');
  1160.         }
  1161.         w_password[j] = '\0';
  1162.         portsout("\r\n\n");
  1163.  
  1164. #ifdef DEBUG
  1165.         if (debug)
  1166.         {
  1167.             printf("u_password=%s\n",u_password);
  1168.             printf("w_password=%s\n",w_password);
  1169.             printf("<cr>\n");
  1170.             getchar();
  1171.         }
  1172. #endif
  1173.         if (strcmp(u_password,w_password) == OK)
  1174.         {
  1175.             break;    /* get it right twice, then get out */
  1176.         }
  1177.         portsout(CRLF);
  1178.         portsout("hmmmm, one of us forgot it already\r\n");
  1179.         portsout("    let's try it again!!\r\n\n");
  1180.     }
  1181.  
  1182.  
  1183.     wrtuser(iobuf);        /* write a user record */
  1184.  
  1185.     putc(CPMEOF,iobuf);    /* put hex 1a on end of file */
  1186.     fflush(iobuf);        /* ok leor, just for you */
  1187.     fclose(iobuf);        /* close the file after new user added */
  1188.     unlink(USERS);        /* delete current file */
  1189.     rename(USERX,USERS);    /* rename temp file to current file */
  1190.  
  1191. #ifdef DEBUG
  1192.     if (debug)
  1193.     {
  1194.         printf("ending newuser()\n");
  1195.     }
  1196. #endif
  1197.     
  1198. }
  1199. /*    end of function        */
  1200.  
  1201. readuser(buf)    /* read a record from the user file */
  1202.         /*  returns 0 on eof, 1 on good read */
  1203. char    *buf;
  1204. {
  1205.     int    code;
  1206.  
  1207.     code = fscanf(buf,"%s~%s~%s~%s~%s~%s~%s~%s~",
  1208.             u_fname,
  1209.             u_lname,
  1210.             u_password,
  1211.             u_time1,
  1212.             u_date1,
  1213.             u_time2,
  1214.             u_date2,
  1215.             u_city);
  1216.  
  1217. #ifdef DEBUG
  1218.     if (debug)
  1219.     {
  1220.         printf("in readuser    u_fname   =%s\n",u_fname);
  1221.         printf("        u_lname   =%s\n",u_lname);
  1222.         printf("        u_password=%s\n",u_password);
  1223.         printf("        u_date1   =%s\n",u_date1);
  1224.         printf("        u_time1   =%s\n",u_time1);
  1225.         printf("        u_date2   =%s\n",u_date2);
  1226.         printf("        u_time2   =%s\n",u_time2);
  1227.         printf("        u_city    =%s\n",u_city);
  1228.         printf("        field count =%d\n",code);
  1229.     }
  1230. #endif
  1231.     if (code == -1 || code == 0)
  1232.     {
  1233.         return(0);    /* all done, hit eof */
  1234.     }
  1235.     else
  1236.     {
  1237.         return(1);    /* good read */
  1238.     }
  1239. }
  1240. /*    end of function        */
  1241.  
  1242. wrtuser(buf)
  1243. char    *buf;
  1244. {
  1245.     int    code;
  1246.  
  1247. #ifdef DEBUG
  1248.     if (debug)
  1249.     {
  1250.         printf("in wrtuser    u_fname   =%s\n",u_fname);
  1251.         printf("        u_lname   =%s\n",u_lname);
  1252.         printf("        u_password=%s\n",u_password);
  1253.         printf("        u_date1   =%s\n",u_date1);
  1254.         printf("        u_time1   =%s\n",u_time1);
  1255.         printf("        u_date2   =%s\n",u_date2);
  1256.         printf("        u_time2   =%s\n",u_time2);
  1257.         printf("        u_city    =%s\n",u_city);
  1258.     }
  1259. #endif
  1260.  
  1261.     code = fprintf(buf,"%s~%s~%s~%s~%s~%s~%s~%s~",
  1262.             u_fname,
  1263.             u_lname,
  1264.             u_password,
  1265.             u_time1,
  1266.             u_date1,
  1267.             u_time2,
  1268.             u_date2,
  1269.             u_city);
  1270.     if (code == -1)
  1271.     {
  1272.         printf("User file has problem writing\n");
  1273.         printf("  write failed...\n");
  1274.     }
  1275.     else
  1276.     {
  1277.         fputs("\n",buf);    /* put cr,lf on end of each record */
  1278.     }
  1279.  
  1280. #ifdef DEBUG
  1281.     if (debug)
  1282.     {
  1283.         printf("leaving wrtuser\n");
  1284.     }
  1285. #endif
  1286. }
  1287. /*    end of function        */
  1288.  
  1289. filecpy(from,to)    /* copy file "from" to file "to" */
  1290. char    *from,        /* this function leaves the "to" file open */
  1291.     *to;        /*  as output, because BDS has no append mode */
  1292. {
  1293.     char    rcd[300];
  1294.  
  1295. #ifdef DEBUG
  1296.     if (debug)
  1297.     {
  1298.         printf("in filecpy\n");
  1299.     }
  1300. #endif
  1301.  
  1302.     if (fopen(from,ibuf) == ERROR)
  1303.     {
  1304.         portsout("\r\nOpen failed for ");
  1305.         portsout(from);
  1306.         portsout(CRLF);
  1307.         return(ERROR);
  1308.     }
  1309.     if (fcreat(to,iobuf) == ERROR)
  1310.     {
  1311.         portsout("\r\nCreate failed for ");
  1312.         portsout(to);
  1313.         portsout(CRLF);
  1314.         return(ERROR);
  1315.     }
  1316.  
  1317.     while (fgets(rcd,ibuf))
  1318.     {
  1319.         fputs(rcd,iobuf);
  1320.     }
  1321.  
  1322.     fclose(ibuf);
  1323.  
  1324. #ifdef DEBUG
  1325.     if (debug)
  1326.     {
  1327.         printf("leaving filecpy\n");
  1328.     }
  1329. #endif
  1330.     return(OK);
  1331. }
  1332. /*    end of function */
  1333.  
  1334. fileapp(file1,file2)        /* append file2 to file1 */
  1335. char    *file1,
  1336.     *file2;
  1337. {
  1338.     char    rcd[300];
  1339.  
  1340. #ifdef DEBUG
  1341.     if (debug)
  1342.     {
  1343.         printf("in fileapp\n");
  1344.     }
  1345. #endif
  1346.  
  1347.     if (fopen(file1,ibuf) == ERROR)            /* open file1 input */
  1348.     {
  1349.         printf("\r\nOpen failed for %s\r\n",file1);
  1350.         return(ERROR);
  1351.     }
  1352.     if (fcreat("TEMPAPP.$$$",iobuf) == ERROR)    /* open temp output */
  1353.     {
  1354.         printf("\r\nCreate failed for TEMPAPP.$$$\r\n");
  1355.         return(ERROR);
  1356.     }
  1357.  
  1358.     while (fgets(rcd,ibuf))        /* copy file1 to temp */
  1359.     {
  1360.         fputs(rcd,iobuf);
  1361.     }
  1362.     fclose(ibuf);            /* close file1 */
  1363.     if (fopen(file2,ibuf) == ERROR)    /* open  file2 input */
  1364.     {
  1365.         printf("\r\nOpen failed for %s\r\n",file2);
  1366.         return(ERROR);
  1367.     }
  1368.     while (fgets(rcd,ibuf))        /* append file2 to temp */
  1369.     {
  1370.         fputs(rcd,iobuf);
  1371.     }
  1372.     fclose(ibuf);            /* close file2 */
  1373.     putc(CPMEOF,iobuf);        /* put hex 1a on end of file */
  1374.     fflush(iobuf);            /* close temp */
  1375.     fclose(iobuf);
  1376.     unlink(file1);            /* delete file1 */
  1377.     rename("TEMPAPP.$$$",file1);    /* rename temp to file1 */
  1378.  
  1379. #ifdef DEBUG
  1380.     if (debug)
  1381.     {
  1382.         printf("leaving fileapp\n");
  1383.     }
  1384. #endif
  1385.     return(OK);
  1386. }
  1387. /*    end of function */
  1388.  
  1389. signoff()
  1390. {
  1391.     ;
  1392. }
  1393. /*    end of function        */
  1394.  
  1395. /*    end of program      */
  1396.